package basis.idnr;

/**
 * Diese Klasse dient der Speicherung und Wiedergabe von ISBN10-Nummern.
 * 
 * Datei: ISBN10.java                   
 * Datum: 19.11.2011   
 *                  
 * @author Alexander Bredo 
 * @version 0.3
 */
public class ISBN10 extends Identifikationsnummer 
{
  private static final long serialVersionUID = -4747532243542832075L;
  protected long isbn;
  
  
  /** 
   * Erstellt ein ISBN10-Objekt aus einer Zeichenfolge
   */
  public ISBN10 (String isbn) throws IllegalArgumentException
  {
    this (gibZahl (isbn));
  }
  
  
  /** 
   * Erstellt ein ISBN10-Objekt aus einer Zahl
   */
  public ISBN10 (long isbn) throws IllegalArgumentException
  {
    if (!istGueltigeLaenge (isbn))
    {
      throw new IllegalArgumentException (
          "Die ISBN hat nicht die richtige Laenge (10 Zeichen).");
    }
    if (!istGueltig (isbn))
    {
      throw new IllegalArgumentException (
          "Die Pruefsumme stimmt nicht mit der ISBN ueberein.");
    }
    
    this.isbn = isbn;
  }
  
  
  /**
   * Prueft die ISBN-Nummer auf Uebereinstimmung mit der Pruefsumme 
   * und auf ihre Laenge
   */
  public boolean istGueltig (long isbn)
  {
    long ergebnis = 0;

    if (!istGueltigeLaenge (isbn))
    {
      return false;
    }

    for (int i = gibGueltigeLaenge (); i > 0; i--)
    {
      int tmp = (int) (isbn % 10);
      ergebnis += tmp * i;
      isbn = isbn / 10;
    }

    return ergebnis % 11 == 0;
  }
  
  
  /**
   * Prueft die ISBN-Zeichenfolge auf Uebereinstimmung mit der Pruefsumme 
   * und auf ihre Laenge
   */
  public boolean istGueltig (String isbn)
  {
    return istGueltig (gibZahl (isbn));
  }
  
  
  /**
   * Gibt die ISBN-Nummer als String zurueck.
   */
  public String toString ()
  {
    return gibZahlMitFuehrenderNull (isbn, gibGueltigeLaenge ());
  }
  
  
  /**
   * Gibt die ISBN-Nummer als long zurueck
   */
  @Override public long toLong ()
  {
    return isbn;
  }
  
  
  /**
   * Gibt die gueltige Laenge einer ISBN10 zurueck.
   */
  protected int gibGueltigeLaenge ()
  {
    return 10;
  }

}
